package com.hb.B_面向对象.K_多态和拓展
import com.hb.B_面向对象.K_多态和拓展.A_extension.exchange

/**
 * 开放封闭原则：
 *  软件实体应该是可扩展，而不可修改的。
 *
 *  使用拓展函数、属性：
 *  拓展函数的声明非常简单，他的关键字是<Type>。此外我们需要一个"接收者类型"（通常是
 *  类或接口的名称）来作为他的前缀。
 */
fun main() {
    val list = mutableListOf(1, 2, 3)
    /**
     * 集合中的索引为1，2的值交换
     */
    list.exchange(1,2)
    //list.exchange2(1,2) //错误
    println(list)


}
/**
 * MutableList<Int>为例，我们为其扩展一个exchange方法。
 *
 * MutableList是Kotlin标准库Collections中的List容器类，这里作为receiver
 * type ，exchange是扩展函数名。其余和Kotlin声明一个普通函数并无区别。
 *
 * 将扩展函数反编译之后可以看出，我们可以将拓展函数近似理解为静态方法。
 * 静态方法的特点：它独立于该类的任何对象，且不依赖类的特定实例，被该类的所有实例
 * 共享。此外public修饰的静态方法本质上也就是全局方法。所以拓展函数不会带来额外的性能消耗。
 *
 * 拓展函数的作用域：
 * 我们习惯的将拓展函数直接定义在包内，例如我们可以将其放在 com.hb.B_面向对象.K_多态和拓展.A_extension
 * 如果我们需要在其他包中调用，只需要import相应的方法即可，这与调用java全局静态方法类似。除此之外，实际开发
 * 中我们也可能将拓展函数定义在一个Class内部统一管理
 * */
